/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Usuario;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author WillianFrias
 */
public class UsuarioDAOImpl {

    private Connection conn;
    private ResultSet rs;

    public UsuarioDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    public Integer cadastrar(Usuario usuario) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Integer idUsuario = null;
        String sql = "insert into usuario("
                + "nome_usuario, "
                + "data_nascimento_usuario,"
                + "sexo_usuario, "
                + "rg_ie_usuario, "
                + "cpf_cnpj_usuario, "
                + "rua_endereco_usuario, "
                + "numero_endereco_usuario, "
                + "bairro_usuario, "
                + "complemento_usuario, "
                + "cidade_usuario, "
                + "cep_usuario, "
                + "uf_usuario, "
                + "email_usuario, "
                + "telefone_usuario, "
                + "celular_usuario, "
                + "data_cadastro_usuario, "
                + "status_usuario, "
                + "tipo_usuario, "
                + "login_usuario, "
                + "senha_usuario)"
                + "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) returning id_usuario;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, usuario.getNomeUsuario().toUpperCase());
            stmt.setDate(2, new java.sql.Date(usuario.getDataNascimentoUsuario().getTime()));
            stmt.setString(3, usuario.getSexoUsuario().toUpperCase());
            stmt.setString(4, usuario.getRgIeUsuario().toUpperCase());
            stmt.setString(5, usuario.getCpfCnpjUsuario().toUpperCase());
            stmt.setString(6, usuario.getRuaEnderecoUsuario().toUpperCase());
            stmt.setInt(7, usuario.getNumeroEnderecoUsuario());
            stmt.setString(8, usuario.getBairroUsuario().toUpperCase());
            stmt.setString(9, usuario.getComplementoUsuario().toUpperCase());
            stmt.setString(10, usuario.getCidadeUsuario().toUpperCase());
            stmt.setString(11, usuario.getCepUsuario().toUpperCase());
            stmt.setString(12, usuario.getUfUsuario().toUpperCase());
            stmt.setString(13, usuario.getEmailUsuario().toUpperCase());
            stmt.setString(14, usuario.getTelefoneUsuario().toUpperCase());
            stmt.setString(15, usuario.getCelularUsuario().toUpperCase());
            stmt.setDate(16, new java.sql.Date(usuario.getDataCadastroUsuario().getTime()));
            stmt.setString(17, usuario.getStatusUsuario().toUpperCase());
            stmt.setString(18, usuario.getTipoUsuario().toUpperCase());
            stmt.setString(19, usuario.getLoginUsuario().toUpperCase());
            stmt.setString(20, usuario.getSenhaUsuario().toUpperCase());
            rs = stmt.executeQuery();

            while (rs.next()) {
                idUsuario = rs.getInt("id_usuario");
            }

        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Usuario! Erro UsuarioDAO:" + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro UsuarioDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return idUsuario;
    }

    public List<Object> listar() {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        List<Object> resultado = new ArrayList<Object>();
        String sql = "select u.* from usuario u order by u.nome_usuario;";
        try {
            stmt = conn.prepareStatement(sql);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Usuario usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("id_usuario"));
                usuario.setNomeUsuario(rs.getString("nome_usuario"));
                usuario.setDataNascimentoUsuario(rs.getDate("data_nascimento_usuario"));
                usuario.setSexoUsuario(rs.getString("sexo_usuario"));
                usuario.setRgIeUsuario(rs.getString("rg_ie_usuario"));
                usuario.setCpfCnpjUsuario(rs.getString("cpf_cnpj_usuario"));
                usuario.setRuaEnderecoUsuario(rs.getString("rua_endereco_usuario"));
                usuario.setNumeroEnderecoUsuario(rs.getInt("numero_endereco_usuario"));
                usuario.setBairroUsuario(rs.getString("bairro_usuario"));
                usuario.setComplementoUsuario(rs.getString("complemento_usuario"));
                usuario.setCidadeUsuario(rs.getString("cidade_usuario"));
                usuario.setCepUsuario(rs.getString("cep_usuario"));
                usuario.setUfUsuario(rs.getString("uf_usuario"));
                usuario.setEmailUsuario(rs.getString("email_usuario"));
                usuario.setTelefoneUsuario(rs.getString("telefone_usuario"));
                usuario.setCelularUsuario(rs.getString("celular_usuario"));
                usuario.setDataCadastroUsuario(rs.getDate("data_cadastro_usuario"));
                usuario.setStatusUsuario(rs.getString("status_usuario"));
                usuario.setLoginUsuario(rs.getString("login_usuario"));
                usuario.setSenhaUsuario(rs.getString("senha_usuario"));
                resultado.add(usuario);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas ao listar Usuario! Erro UsuarioDAO: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro UsuarioDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return resultado;
    }

    public Object carregar(int idObject) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "select u.* from usuario u where u.id_usuario = ?;";
        Usuario usuario = null;
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();

            while (rs.next()) {
                usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("id_usuario"));
                usuario.setNomeUsuario(rs.getString("nome_usuario"));
                usuario.setDataNascimentoUsuario(rs.getDate("data_nascimento_usuario"));
                usuario.setSexoUsuario(rs.getString("sexo_usuario"));
                usuario.setRgIeUsuario(rs.getString("rg_ie_usuario"));
                usuario.setCpfCnpjUsuario(rs.getString("cpf_cnpj_usuario"));
                usuario.setRuaEnderecoUsuario(rs.getString("rua_endereco_usuario"));
                usuario.setNumeroEnderecoUsuario(rs.getInt("numero_endereco_usuario"));
                usuario.setBairroUsuario(rs.getString("bairro_usuario"));
                usuario.setComplementoUsuario(rs.getString("complemento_usuario"));
                usuario.setCidadeUsuario(rs.getString("cidade_usuario"));
                usuario.setCepUsuario(rs.getString("cep_usuario"));
                usuario.setUfUsuario(rs.getString("uf_usuario"));
                usuario.setEmailUsuario(rs.getString("email_usuario"));
                usuario.setTelefoneUsuario(rs.getString("telefone_usuario"));
                usuario.setCelularUsuario(rs.getString("celular_usuario"));
                usuario.setDataCadastroUsuario(rs.getDate("data_cadastro_usuario"));
                usuario.setStatusUsuario(rs.getString("status_usuario"));
                usuario.setLoginUsuario(rs.getString("login_usuario"));
                usuario.setSenhaUsuario(rs.getString("senha_usuario"));
            }
        } catch (Exception ex) {
            System.out.println("Problemas ao carregar Usuario! Erro UsuarioDAO: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro UsuarioDAO: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return usuario;
    }

    public Boolean alterar(Object object) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String sql = "update usuario set nome_usuario = ?, data_nascimento_usuario = ?, sexo_usuario = ?, "
                + "rg_ie_usuario = ?, cpf_cnpj_usuario = ?, rua_endereco_usuario = ?, numero_endereco_usuario = ?, "
                + "bairro_usuario = ?, complemento_usuario = ?, cidade_usuario = ?, cep_usuario = ?, "
                + "uf_usuario = ?, email_usuario = ?, telefone_usuario = ?, celular_usuario = ?, data_cadastro_usuario = ?, "
                + "status_usuario = ?, login_usuario = ?, senha_usuario = ?"
                + "where id_usuario = ?;";
        Usuario usuario = (Usuario) object;
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, usuario.getNomeUsuario().toUpperCase());
            stmt.setDate(2, new java.sql.Date(usuario.getDataNascimentoUsuario().getTime()));
            stmt.setString(3, usuario.getSexoUsuario().toUpperCase());
            stmt.setString(4, usuario.getRgIeUsuario().toUpperCase());
            stmt.setString(5, usuario.getCpfCnpjUsuario().toUpperCase());
            stmt.setString(6, usuario.getRuaEnderecoUsuario().toUpperCase());
            stmt.setInt(7, usuario.getNumeroEnderecoUsuario());
            stmt.setString(8, usuario.getBairroUsuario().toUpperCase());
            stmt.setString(9, usuario.getComplementoUsuario().toUpperCase());
            stmt.setString(10, usuario.getCidadeUsuario().toUpperCase());
            stmt.setString(11, usuario.getCepUsuario().toUpperCase());
            stmt.setString(12, usuario.getUfUsuario().toUpperCase());
            stmt.setString(13, usuario.getEmailUsuario().toUpperCase());
            stmt.setString(14, usuario.getTelefoneUsuario().toUpperCase());
            stmt.setString(15, usuario.getCelularUsuario().toUpperCase());
            stmt.setDate(16, new java.sql.Date(usuario.getDataCadastroUsuario().getTime()));
            stmt.setString(17, usuario.getStatusUsuario().toUpperCase());
            stmt.setString(18, usuario.getLoginUsuario().toUpperCase());
            stmt.setString(19, usuario.getSenhaUsuario().toUpperCase());
            stmt.setInt(20, usuario.getIdUsuario());
            stmt.execute();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas ao alterar Usuario! Erro UsuarioDAO:" + ex.getMessage());
            ex.printStackTrace();
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro UsuarioDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }

    public Usuario logarUsuario(String login, String senha) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Usuario usuario = null;
        String sql = "select u.id_usuario, u.nome_usuario, u.data_nascimento_usuario, u.sexo_usuario, u.rg_ie_usuario, "
                + "u.cpf_cnpj_usuario, u.rua_endereco_usuario, u.numero_endereco_usuario, u.bairro_usuario, "
                + "u.complemento_usuario, u.cidade_usuario, u.cep_usuario, u.uf_usuario, u.email_usuario, "
                + "u.telefone_usuario, u.celular_usuario, u.data_cadastro_usuario, u.tipo_usuario, u.status_usuario, u.login_usuario, "
                + "u.senha_usuario from usuario u "
                + "where u.login_usuario = ? "
                + "and u.senha_usuario = ?  ";;
        //int id = 1;
        try {
            stmt = conn.prepareStatement(sql);
            //stmt.setString(id, Login);
            //id++;
            //stmt.setString(id, Senha);
            stmt.setString(1, login.toUpperCase());
            stmt.setString(2, senha.toUpperCase());
            rs = stmt.executeQuery();

            while (rs.next()) {
                usuario = new Usuario();
                usuario.setIdUsuario(rs.getInt("id_usuario"));
                usuario.setNomeUsuario(rs.getString("nome_usuario"));
                usuario.setDataNascimentoUsuario(rs.getDate("data_nascimento_usuario"));
                usuario.setSexoUsuario(rs.getString("sexo_usuario"));
                usuario.setRgIeUsuario(rs.getString("rg_ie_usuario"));
                usuario.setCpfCnpjUsuario(rs.getString("cpf_cnpj_usuario"));
                usuario.setRuaEnderecoUsuario(rs.getString("rua_endereco_usuario"));
                usuario.setNumeroEnderecoUsuario(rs.getInt("numero_endereco_usuario"));
                usuario.setBairroUsuario(rs.getString("bairro_usuario"));
                usuario.setComplementoUsuario(rs.getString("complemento_usuario"));
                usuario.setCidadeUsuario(rs.getString("cidade_usuario"));
                usuario.setCepUsuario(rs.getString("cep_usuario"));
                usuario.setUfUsuario(rs.getString("uf_usuario"));
                usuario.setEmailUsuario(rs.getString("email_usuario"));
                usuario.setTelefoneUsuario(rs.getString("telefone_usuario"));
                usuario.setCelularUsuario(rs.getString("celular_usuario"));
                usuario.setDataCadastroUsuario(rs.getDate("data_cadastro_usuario"));
                usuario.setStatusUsuario(rs.getString("status_usuario"));
                usuario.setTipoUsuario(rs.getString("tipo_usuario"));
                usuario.setLoginUsuario(rs.getString("login_usuario"));
                usuario.setSenhaUsuario(rs.getString("senha_usuario"));
            }
        } catch (SQLException ex) {
            System.out.println("Erro ao Logar Usuário! Erro UsuarioDAO: " + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problema ao Fechar os Parâmetros de Conexão! Erro UsuarioDAO: " + ex.getMessage());
            }
        }
        return usuario;
    }
}
